<?php

namespace app\admin\controller;

use app\admin\controller\BaseController;
use think\Request;
use think\Validate;
use think\Db;

class Permission extends BaseController
{
    // 设置模型名称
    protected $modelName = 'auth_group';

    protected $uniqueFields = ['name'];

    protected $fieldLabels = [
        'name' => '角色名称',
    ];

    // 设置验证规则
    // 添加自定义string验证规则
    public function __construct()
    {
        parent::__construct();
        Validate::extend('string', function ($value) {
            return is_string($value);
        }, '必须是字符串类型');
    }

    // 设置验证规则
    protected $validateRules = [
        'id' => 'number',
        'name' => 'require|max:10',
        'desc' => 'string|max:100'
    ];

    // 设置规则提示
    protected $validateRulesMsg = [
        'name.require' => '角色名称不能为空',
        'name.max' => '角色名称最多10个字符',
        'desc.max' => '角色描述最多100个字符',
    ];

    /**
     * 菜单列表
     * 重写父类方法以自定义排序方式
     * */
    public function getList()
    {
        $list = $this->model->order('sort asc')->select();
        apiReturn(1, '获取数据成功', $list);
    }

    /**
     * 获取权限菜单列表
     * @return json 菜单列表及权限状态
     */
    public function permissionMenuList()
    {
        // 获取auth_group_id参数
        $authGroupId = $this->request->param('auth_group_id', 0);

        if (empty($authGroupId)) {
            apiReturn(2, '权限分组ID不能为空');
        }

        // 查询权限分组信息
        $authGroup = $this->model->where('id', $authGroupId)->find();

        if (!$authGroup) {
            apiReturn(2, '权限分组不存在');
        }

        // 获取权限分组的规则id
        $rules = $authGroup['rules'];
        $ruleIds = $rules ? explode(',', $rules) : [];

        // 查询所有菜单
        $menuList = Db::name('menu')
            ->where('status', 1)
            ->order('sort asc, id asc')
            ->select();

        // 处理每个菜单的权限状态
        foreach ($menuList as &$menu) {
            $menu['is_auth'] = in_array($menu['id'], $ruleIds) ? 1 : 0;
        }

        apiReturn(1, '获取数据成功', $menuList);
    }

    /**
     * 访问授权
     * */
    public function visit()
    {
        $input = $this->request->param();

        $id = $input['id'];
        $ids = $input['ids'];

        if (empty($id)) apiReturn(2, '权限分组ID缺失');

        $data = [
            'rules' => $ids,
            'update_time' => time()
        ];
        $res = Db::name('auth_group')->where(['id' => $id])->update($data);
        if ($res) {
            apiReturn(1, '保存成功');
        } else {
            apiReturn(2, '保存失败');
        }
    }
}
